package org.adoxx.pn; import java.util.ArrayList; import java.util.HashMap; public class PetriNet implements java.io.Serializable{ private static final long serialVersionUID = 3426953988681102210L; private String name; private ArrayList

placeList = new ArrayList

(); private ArrayList transitionList = new ArrayList(); private ArrayList

startList = new ArrayList

(); private ArrayList

endList = new ArrayList

(); private ArrayList connectionPTList = new ArrayList(); private ArrayList connectionTPList = new ArrayList(); public HashMap additionalInfoList = new HashMap(); public PetriNet(String name){ this.name = name; } public void setName(String name){ this.name = name; } public String getName(){ return name; } public void resetNet(){ placeList.clear(); transitionList.clear(); startList.clear(); endList.clear(); connectionPTList.clear(); connectionTPList.clear(); } public PetriNet clonePN() throws Exception{ java.io.ByteArrayOutputStream bos = new java.io.ByteArrayOutputStream(512); java.io.ObjectOutputStream out = new java.io.ObjectOutputStream(bos); out.writeObject(this); byte[] bytes = bos.toByteArray(); out.close(); java.io.ObjectInputStream ois = new java.io.ObjectInputStream(new java.io.ByteArrayInputStream(bytes)); PetriNet readObject = (PetriNet) ois.readObject(); ois.close(); return readObject; } public void importPN(PetriNet petriNet) throws Exception{ petriNet = petriNet.clonePN(); placeList.addAll(petriNet.placeList); transitionList.addAll(petriNet.transitionList); startList.addAll(petriNet.startList); endList.addAll(petriNet.endList); connectionPTList.addAll(petriNet.connectionPTList); connectionTPList.addAll(petriNet.connectionTPList); } @SuppressWarnings("unchecked") public ArrayList

getPlaceList_safe(){ return (ArrayList

) placeList.clone(); } public ArrayList

getPlaceList(){ return placeList; } @SuppressWarnings("unchecked") public ArrayList getTransitionList_safe(){ return (ArrayList) transitionList.clone(); } public ArrayList getTransitionList(){ return transitionList; } @SuppressWarnings("unchecked") public ArrayList

getStartList_safe(){ return (ArrayList

) startList.clone(); } public ArrayList

getStartList(){ return startList; } @SuppressWarnings("unchecked") public ArrayList

getEndList_safe(){ return (ArrayList

) endList.clone(); } public ArrayList

getEndList(){ return endList; } @SuppressWarnings("unchecked") public ArrayList getConnectionPTList_safe(){ return (ArrayList) connectionPTList.clone(); } public ArrayList getConnectionPTList(){ return connectionPTList; } @SuppressWarnings("unchecked") public ArrayList getConnectionTPList_safe(){ return (ArrayList) connectionTPList.clone(); } public ArrayList getConnectionTPList(){ return connectionTPList; } public boolean isEmpty(){ return placeList.isEmpty() && transitionList.isEmpty(); } public P addPlace(String name) throws Exception{ return addPlace(name, 0); } public P addPlace(String name, int numToken) throws Exception{ if(name == null || name.isEmpty()) throw new Exception("ERROR: Name is empty or null"); for(P place:placeList) if(place.name.equals(name)) throw new Exception("ERROR: A place with name " + name + " already exist"); P ret = new P(name); ret.numToken = numToken; ret.petrinet = this; placeList.add(ret); //if(numToken>0) // startList.add(ret); return ret; } public void delPlace(String name) throws Exception{ delPlace(getPlace(name)); } public void delPlace(P place) throws Exception{ placeList.remove(place); endList.remove(place); startList.remove(place); for(T tr0:place.getPreviousList_safe()) delConnection(tr0, place); for(T tr0:place.getNextList_safe()) delConnection(place, tr0); } public ArrayList getEnabledTransitions() throws Exception{ return getEnabledTransitions(getCurrentMark()); } //FIXME: leggere arc weight!!! public ArrayList getEnabledTransitions(int[] startingMarkList) throws Exception{ if(startingMarkList == null) throw new Exception("ERROR: starting mark can not be null"); if(startingMarkList.length != placeList.size()) throw new Exception("ERROR: you have to provide a mark for each place"); ArrayList enabledList = new ArrayList(); for(T transition: transitionList){ boolean isEnabled=true; for(P place:transition.previousList) if(startingMarkList[placeList.indexOf(place)]==0) isEnabled = false; if(isEnabled) enabledList.add(transition); } return enabledList; } //FIXME: leggere arc weight!!! public void fireTransition(T transition) throws Exception{ if(!getEnabledTransitions().contains(transition)) throw new Exception("ERROR: transition " + transition.name + " can not be fired"); for(P place: transition.previousList) if(place.numToken>0) place.numToken--; for(P place: transition.nextList) if(place.numToken>=0) place.numToken++; } public int[] getCurrentMark(){ int[] mark = new int[placeList.size()]; for(int i=0; i newEndList = new ArrayList

(); for(P place:placeList) if(place.nextList.isEmpty()) newEndList.add(place); this.endList = newEndList; } private void updateStartList(){ ArrayList

newStartList = new ArrayList

(); for(P place:placeList) if(place.numToken>0) newStartList.add(place); this.startList = newStartList; } public void updateStartListCheckingFlow(){ ArrayList

newStartList = new ArrayList

(); for(P place:placeList) if(place.numToken>0) newStartList.add(place); else if(place.previousList.isEmpty()){ place.numToken = 1; newStartList.add(place); } this.startList = newStartList; } /* public static void main(String[] args) { try { PetriNet pn = new PetriNet("test"); PL p0 = pn.addPlace("p0", 1); TR t0 = pn.addTransition("t0"); PL p1 = pn.addPlace("p1"); TR t1 = pn.addTransition("t1"); //PL p2 = pn.addPlace("p2"); pn.connect(p0, t0); //pn.connect(p0, t1); pn.connect(t0, p1); pn.connect(p1, t1); //pn.connect(t1, p2); //pn.delTransition(t0); //pn.delPlace(p1); pn.finalizeModel(); System.out.println(PNExport.exportTo_PNML(pn)); } catch (Exception e) { e.printStackTrace(); } } */ }